﻿using System.Runtime.InteropServices;

public static class KeyboardSimulation
{
    #region DLL
    [DllImport("user32.dll")]
    private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
    #endregion

    #region FuncConst
    public const int KEYEVENTF_EXTENDEDKEY  = 0x0001;
    public const int KEYEVENTF_KEYUP        = 0x0002;
    #endregion

    #region KeyCode
    public const byte VK_LBUTTON = 0x01;    // Left mouse button
    public const byte VK_RBUTTON = 0x02;    // Right mouse button
    public const byte VK_CANCEL = 0x03; // Control-break processing
    public const byte VK_MBUTTON = 0x04;    // Middle mouse button (three-button mouse)
    public const byte VK_XBUTTON1 = 0x05;   // X1 mouse button
    public const byte VK_XBUTTON2 = 0x06;   // X2 mouse button
    public const byte VK_BACK = 0x08;   // BACKSPACE key
    public const byte VK_TAB = 0x09;    // TAB key
    public const byte VK_CLEAR = 0x0C;  // CLEAR key
    public const byte VK_RETURN = 0x0D; // ENTER key
    public const byte VK_SHIFT = 0x10;  // SHIFT key
    public const byte VK_CONTROL = 0x11;    // CTRL key
    public const byte VK_MENU = 0x12;   // ALT key
    public const byte VK_PAUSE = 0x13;  // PAUSE key
    public const byte VK_CAPITAL = 0x14;    // CAPS LOCK key
    public const byte VK_KANA = 0x15;   // IME Kana mode
    public const byte VK_HANGUEL = 0x15;    // IME Hanguel mode (maintained for compatibility; use VK_HANGUL)
    public const byte VK_HANGUL = 0x15; // IME Hangul mode
    public const byte VK_JUNJA = 0x17;  // IME Junja mode
    public const byte VK_FINAL = 0x18;  // IME final mode
    public const byte VK_HANJA = 0x19;  // IME Hanja mode
    public const byte VK_KANJI = 0x19;  // IME Kanji mode
    public const byte VK_ESCAPE = 0x1B; // ESC key
    public const byte VK_CONVERT = 0x1C;    // IME convert
    public const byte VK_NONCONVERT = 0x1D; // IME nonconvert
    public const byte VK_ACCEPT = 0x1E; // IME accept
    public const byte VK_MODECHANGE = 0x1F; // IME mode change request
    public const byte VK_SPACE = 0x20;  // SPACEBAR
    public const byte VK_PRIOR = 0x21;  // PAGE UP key
    public const byte VK_NEXT = 0x22;   // PAGE DOWN key
    public const byte VK_END = 0x23;    // END key
    public const byte VK_HOME = 0x24;   // HOME key
    public const byte VK_LEFT = 0x25;   // LEFT ARROW key
    public const byte VK_UP = 0x26; // UP ARROW key
    public const byte VK_RIGHT = 0x27;  // RIGHT ARROW key
    public const byte VK_DOWN = 0x28;   // DOWN ARROW key
    public const byte VK_SELECT = 0x29; // SELECT key
    public const byte VK_PRINT = 0x2A;  // PRINT key
    public const byte VK_EXECUTE = 0x2B;    // EXECUTE key
    public const byte VK_SNAPSHOT = 0x2C;   // PRINT SCREEN key
    public const byte VK_INSERT = 0x2D; // INS key
    public const byte VK_DELETE = 0x2E; // DEL key
    public const byte VK_HELP = 0x2F;   // HELP key 0x30 0 key 0x31 1 key 0x32 2 key 0x33 3 key 0x34 4 key 0x35 5 key 0x36 6 key 0x37 7 key 0x38 8 key 0x39 9 key
    public const byte VK_LWIN = 0x5B;   // Left Windows key (Natural keyboard) 
    public const byte VK_RWIN = 0x5C;   // Right Windows key (Natural keyboard)
    public const byte VK_APPS = 0x5D;   // Applications key (Natural keyboard)
    public const byte VK_SLEEP = 0x5F;  // Computer Sleep key
    public const byte VK_NUMPAD0 = 0x60;    // Numeric keypad 0 key
    public const byte VK_NUMPAD1 = 0x61;    // Numeric keypad 1 key
    public const byte VK_NUMPAD2 = 0x62;    // Numeric keypad 2 key
    public const byte VK_NUMPAD3 = 0x63;    // Numeric keypad 3 key
    public const byte VK_NUMPAD4 = 0x64;    // Numeric keypad 4 key
    public const byte VK_NUMPAD5 = 0x65;    // Numeric keypad 5 key
    public const byte VK_NUMPAD6 = 0x66;    // Numeric keypad 6 key
    public const byte VK_NUMPAD7 = 0x67;    // Numeric keypad 7 key
    public const byte VK_NUMPAD8 = 0x68;    // Numeric keypad 8 key
    public const byte VK_NUMPAD9 = 0x69;    // Numeric keypad 9 key
    public const byte VK_MULTIPLY = 0x6A;   // Multiply key
    public const byte VK_ADD = 0x6B;    // Add key
    public const byte VK_SEPARATOR = 0x6C;  // Separator key
    public const byte VK_SUBTRACT = 0x6D;   // Subtract key
    public const byte VK_DECIMAL = 0x6E;    // Decimal key
    public const byte VK_DIVIDE = 0x6F; // Divide key
    public const byte VK_F1 = 0x70; // F1 key
    public const byte VK_F2 = 0x71; // F2 key
    public const byte VK_F3 = 0x72; // F3 key
    public const byte VK_F4 = 0x73; // F4 key
    public const byte VK_F5 = 0x74; // F5 key
    public const byte VK_F6 = 0x75; // F6 key
    public const byte VK_F7 = 0x76; // F7 key
    public const byte VK_F8 = 0x77; // F8 key
    public const byte VK_F9 = 0x78; // F9 key
    public const byte VK_F10 = 0x79;    // F10 key
    public const byte VK_F11 = 0x7A;    // F11 key
    public const byte VK_F12 = 0x7B;    // F12 key
    public const byte VK_F13 = 0x7C;    // F13 key
    public const byte VK_F14 = 0x7D;    // F14 key
    public const byte VK_F15 = 0x7E;    // F15 key
    public const byte VK_F16 = 0x7F;    // F16 key
    public const byte VK_F17 = 0x80;    // F17 key
    public const byte VK_F18 = 0x81;    // F18 key
    public const byte VK_F19 = 0x82;    // F19 key
    public const byte VK_F20 = 0x83;    // F20 key
    public const byte VK_F21 = 0x84;    // F21 key
    public const byte VK_F22 = 0x85;    // F22 key
    public const byte VK_F23 = 0x86;    // F23 key
    public const byte VK_F24 = 0x87;    // F24 key
    public const byte VK_NUMLOCK = 0x90;    // NUM LOCK key
    public const byte VK_SCROLL = 0x91; // SCROLL LOCK key 0x92-96 OEM specific
    public const byte VK_LSHIFT = 0xA0; // Left SHIFT key
    public const byte VK_RSHIFT = 0xA1; // Right SHIFT key
    public const byte VK_LCONTROL = 0xA2;   // Left CONTROL key
    public const byte VK_RCONTROL = 0xA3;   // Right CONTROL key
    public const byte VK_LMENU = 0xA4;  // Left MENU key
    public const byte VK_RMENU = 0xA5;  // Right MENU key
    public const byte VK_BROWSER_BACK = 0xA6;   // Browser Back key
    public const byte VK_BROWSER_FORWARD = 0xA7;    // Browser Forward key
    public const byte VK_BROWSER_REFRESH = 0xA8;    // Browser Refresh key
    public const byte VK_BROWSER_STOP = 0xA9;   // Browser Stop key
    public const byte VK_BROWSER_SEARCH = 0xAA; // Browser Search key 
    public const byte VK_BROWSER_FAVORITES = 0xAB;  // Browser Favorites key
    public const byte VK_BROWSER_HOME = 0xAC;   // Browser Start and Home key
    public const byte VK_VOLUME_MUTE = 0xAD;    // Volume Mute key
    public const byte VK_VOLUME_DOWN = 0xAE;    // Volume Down key
    public const byte VK_VOLUME_UP = 0xAF;  // Volume Up key
    public const byte VK_MEDIA_NEXT_TRACK = 0xB0;   // Next Track key
    public const byte VK_MEDIA_PREV_TRACK = 0xB1;   // Previous Track key
    public const byte VK_MEDIA_STOP = 0xB2; // Stop Media key
    public const byte VK_MEDIA_PLAY_PAUSE = 0xB3;   // Play/Pause Media key
    public const byte VK_LAUNCH_MAIL = 0xB4;    // Start Mail key
    public const byte VK_LAUNCH_MEDIA_SELECT = 0xB5;    // Select Media key
    public const byte VK_LAUNCH_APP1 = 0xB6;    // Start Application 1 key
    public const byte VK_LAUNCH_APP2 = 0xB7;    // Start Application 2 key
    public const byte VK_OEM_1 = 0xBA;  // Used for miscellaneous characters; it can vary by keyboard.
    public const byte VK_OEM_PLUS = 0xBB;   // For any country/region, the '+' key
    public const byte VK_OEM_COMMA = 0xBC;  // For any country/region, the ',' key
    public const byte VK_OEM_MINUS = 0xBD;  // For any country/region, the '-' key
    public const byte VK_OEM_PERIOD = 0xBE; // For any country/region, the '.' key
    public const byte VK_OEM_2 = 0xBF;  // Used for miscellaneous characters; it can vary by keyboard.
    public const byte VK_OEM_3 = 0xC0;  // Used for miscellaneous characters; it can vary by keyboard. 
    public const byte VK_OEM_4 = 0xDB;  // Used for miscellaneous characters; it can vary by keyboard. 
    public const byte VK_OEM_5 = 0xDC;  // Used for miscellaneous characters; it can vary by keyboard. 
    public const byte VK_OEM_6 = 0xDD;  // Used for miscellaneous characters; it can vary by keyboard. 
    public const byte VK_OEM_7 = 0xDE;  // Used for miscellaneous characters; it can vary by keyboard. 
    public const byte VK_OEM_8 = 0xDF;  // Used for miscellaneous characters; it can vary by keyboard.
    public const byte VK_OEM_102 = 0xE2;    // Either the angle bracket key or the backslash key on the RT 102-key keyboard 0xE3-E4 OEM specific
    public const byte VK_PROCESSKEY = 0xE5; // IME PROCESS key 0xE6 OEM specific
    public const byte VK_PACKET = 0xE7; // Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP
    public const byte VK_ATTN = 0xF6;   // Attn key
    public const byte VK_CRSEL = 0xF7;  // CrSel key
    public const byte VK_EXSEL = 0xF8;  // ExSel key
    public const byte VK_EREOF = 0xF9;  // Erase EOF key
    public const byte VK_PLAY = 0xFA;   // Play key
    public const byte VK_ZOOM = 0xFB;   // Zoom key
    public const byte VK_NONAME = 0xFC; // Reserved 
    public const byte VK_PA1 = 0xFD;    // PA1 key
    public const byte VK_OEM_CLEAR = 0xFE;  // Clear key
    #endregion

    #region Func
    public static void KeyDown(byte keyCode)
    {
        keybd_event(keyCode, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
    }

    public static void KeyUp(byte keyCode)
    {
        keybd_event(keyCode, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
    #endregion
}
